﻿using Framework.Common;
using Framework.Common.Paged;
using IRepositories.Core;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using System.Text;

namespace EntityFramework.Data.Core
{
    /// <summary>
    /// 使用EF框架操作数据库接口
    /// </summary>
    public interface IEFRepository<TEntity> : IExtensionRepository<TEntity> where TEntity : class
    {
        /// <summary>
        /// 更新方法，只对EF支持
        /// 注意本方法不能和GetModel()一起使用，它的表主键可以通过post或get方式获取
        /// </summary>
        /// <param name="entity"></param>
        void Update(Expression<Action<TEntity>> entity);
        #region 批量更新删除数据 以下方法 不能于与其他方法一直共用事务
        /// <summary>
        /// 批量删除，只对mssql,mysql支持
        /// 注:不能用于事务
        /// </summary>
        /// <param name="predicate"></param>
        void Delete(Expression<Func<TEntity, bool>> predicate);
        void Delete(IQueryable<TEntity> query);
        /// <summary>
        /// 批量修改，只对mssql,mysql支持
        /// 没有条件
        /// 注:不能用于事务
        /// </summary>
        /// <param name="updateExpression">指定修改字段及值</param>
        void Update(Expression<Func<TEntity, TEntity>> updateExpression);
        /// <summary>
        /// 批量修改，只对mssql,mysql支持
        /// 注:不能用于事务
        /// </summary>
        /// <param name="predicate">查询条件</param>
        /// <param name="updateExpression">指定修改字段及值</param>
        void Update(Expression<Func<TEntity, bool>> predicate, Expression<Func<TEntity, TEntity>> updateExpression);
        void Update(IQueryable<TEntity> query, Expression<Func<TEntity, TEntity>> updateExpression);
        #endregion


        /// <summary>
        /// 返回的数据会保持状态
        /// </summary>
        /// <returns></returns>
        IQueryable<TEntity> GetModelTracking();

        #region 查询 
        
        /// <summary>
        /// 分页查询
        /// </summary>
        /// <typeparam name="TProperty">要包含的导航属性的类型</typeparam>
        /// <param name="pageNo">当前页数</param>
        /// <param name="pageSize">每页显示总数</param>
        /// <param name="predicateFunc">查询条件</param>
        /// <param name="sortField">排序字段</param>
        /// <returns></returns>
        //CustomPagedList<TEntity> GetPagedList(int pageNo, int pageSize,
        //    Func<IQueryable<TEntity>,IQueryable<TEntity>> predicateFunc,
        //    List<KeyValuePair<string, string>> sortField);
        /// <summary>
        /// 分页查询
        /// 注:调用分页时 sortField 排序字段必传
        /// </summary>
        /// <typeparam name="TProperty">要包含的导航属性的类型</typeparam>
        /// <param name="pageNo">当前页数</param>
        /// <param name="pageSize">每页显示总数</param>
        /// <param name="predicateFunc">查询条件</param>
        /// <param name="sortField">排序字段</param>
        /// <param name="paths">表示要包括的路径的 lambda 表达式</param>
        /// <returns></returns>
        //CustomPagedList<TEntity> GetPagedList<TProperty>(int pageNo, int pageSize, 
        //    Func<IQueryable<TEntity>, IQueryable<TEntity>> predicateFunc,
        //    List<KeyValuePair<string, string>> sortField,
        //    params Expression<Func<TEntity, TProperty>>[] paths);
        #endregion
    }
}
